﻿/*
 * LibLitePlayer.h
 *
 *  Created on: 2016年5月12日
 *      Author: terry
 */

#ifndef LIBLITEPLAYER_H_
#define LIBLITEPLAYER_H_

#include "MFormat.h"
#include "MFrame.h"
////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////
#ifdef __cplusplus
extern "C"
{
#endif

/////////////////////////////////////////////////////////////////////////////

typedef void*	PlayerHandle;


/// 播放状态
enum PlayerState
{
	PLAYER_STATE_STOPPED = 0,
	PLAYER_STATE_PAUSED,
	PLAYER_STATE_PLAYING
};


/**
 * 事件回调句柄
 * @param player	播放器句柄
 * @param event		事件类型
 * @param context	回调环境
 */
typedef void (*PlayerEventCallback)(PlayerHandle handle, int event, const char* value, int size, void* context);

/**
 * 解码后帧回调
 * @param handle	播放器句柄
 * @param frame		媒体帧
 * @param context	回调环境
 */
typedef void (*PlayerFrameCallback)(PlayerHandle handle, MFrame* frame, void* context);

/**
 * 解码前包回调
 * @param handle	播放器句柄
 * @param pkt		媒体包
 * @param context	回调环境
 */
typedef void (*PlayerPacketCallback)(PlayerHandle handle, MPacket* pkt, void* context);


/////////////////////////////////////////////////////////////////////////////

/**
 * 初始化
 * 程序启动时调用, 仅调用一次
 */
DLLEXPORT void player_startup();

/**
 * 清理
 * 不再调用任何此库的API时, 执行清理
 */
DLLEXPORT void player_cleanup();

/**
 * 创建播放器
 * @param hwnd	窗口句柄
 * @return	播放器
 */
DLLEXPORT PlayerHandle player_create(void* hwnd);

/**
 * 销毁播放器
 * @param player
 */
DLLEXPORT void player_destroy(PlayerHandle handle);

/**
 * 打开媒体流
 * @param player
 * @param url		比如: rtsp://192.168.3.1
 * @param params    播放参数
 * @return 0 表示成功, 其他表示错误码
 */
DLLEXPORT int player_open(PlayerHandle handle, const char* url, const char* params);

/**
 * 关闭播放器
 * @param player
 */
DLLEXPORT void player_close(PlayerHandle handle);

/**
 * 判断播放器是否打开
 * @param player
 * @return > 0 表示打开
 */
DLLEXPORT int player_isOpen(PlayerHandle handle);

/**
 * 获取当前的媒体路径
 * @param player
 * @return 空表示没有打开
 */
DLLEXPORT const char* player_getUrl(PlayerHandle handle);

/**
 * 暂停播放
 * @param player
 * @return
 */
DLLEXPORT int player_pause(PlayerHandle handle);

/**
 * 停止播放
 * @param player
 * @return
 */
DLLEXPORT int player_stop(PlayerHandle handle);

/**
 * 开始播放
 * @param player
 * @return
 */
DLLEXPORT int player_play(PlayerHandle handle);

/**
 * 获取媒体格式
 * 在打开播放器,得到 PLAYER_EVENT_FORMAT_READY 事件通知后才有准确的媒体格式
 * @param player
 * @param fmt
 * @return 0 表示成功
 */
DLLEXPORT int player_getFormat(PlayerHandle handle, MFormat* fmt);

/**
 * 获取媒体播放状态
 * @param player
 * @return
 */
DLLEXPORT int player_getState(PlayerHandle handle);

/**
 * 获取音量, 取值范围为 [0, 1.0]
 * @param player
 * @return
 */
DLLEXPORT float player_getVolume(PlayerHandle handle);

/**
 * 设置音量
 * @param player
 * @param volume
 * @return
 */
DLLEXPORT int player_setVolume(PlayerHandle handle, float volume);

/**
 * 获取静音
 * @param player
 * @return
 */
DLLEXPORT int player_isMute(PlayerHandle handle);

/**
 * 设置静音
 * @param player
 * @return
 */
DLLEXPORT int player_setMute(PlayerHandle handle, int mute);

/**
 * 是否全屏
 * @param player
 * @return
 */
DLLEXPORT int player_isFullscreen(PlayerHandle handle);

/**
 * 设置全屏
 * @param player
 * @param full
 * @return
 */
DLLEXPORT int player_setFullscreen(PlayerHandle handle, int full);

/**
 * 设置显示比例
 * 如果cx,cy= 0, 保持视频的原始比率
 * @param player
 * @param cx	宽度比例
 * @param cy	高度比例
 * @return
 */
DLLEXPORT int player_setRatio(PlayerHandle handle, int cx, int cy);

/**
 * 获取显示比例
 * @param player	播放器
 * @param cx		宽度比例
 * @param cy		高度比例
 * @return
 */
DLLEXPORT int player_getRatio(PlayerHandle handle, int* cx, int* cy);

/**
 * 设置视频显示窗口
 * @param hwnd	窗口句柄
 * @return
 */
DLLEXPORT int player_setVideoWnd(PlayerHandle handle, void* hwnd);


/**
 * 设置事件回调句柄
 * @param player	播放器
 * @param cb		回调函数
 * @param context	回调环境
 * @return
 */
DLLEXPORT int player_setEventCallback(PlayerHandle handle, PlayerEventCallback cb, void* context);


/**
 * 获取播放时长
 * @param handle
 * @return 播放时长, 单位为毫秒
 */
DLLEXPORT int player_getDuration(PlayerHandle handle);

/**
 * 判断是否可定位
 * @param handle
 * @return > 0 表示可以拖拽定位
 */
DLLEXPORT int player_seekable(PlayerHandle handle);

/**
 * 定位到指定时间点
 * @param handle
 * @param offset  时间点，单位为毫秒，不应超过 duration
 * @return 0 表示成功
 */
DLLEXPORT int player_seek(PlayerHandle handle, int64_t offset);

/**
 * 获取当前已播放时长
 * @param handle
 * @return 播放时间，单位为毫秒
 */
DLLEXPORT int64_t player_getTime(PlayerHandle handle);

/**
 * 设置播放器logo
 * @param handle
 * @param filepath
 * @return
 */
DLLEXPORT int player_setImage(PlayerHandle handle, const char* filepath);

/**
 * 抓图
 * @param handle
 * @param filepath 图片路径
 * @return 0 表示成功
 */
DLLEXPORT int player_snap(PlayerHandle handle, const char* filepath);


DLLEXPORT void player_setFrameSink(PlayerHandle handle, PlayerFrameCallback cb, void* context);

/**
 * 设置媒体流回调
 * @param pSink 接收未解码媒体包
 */
DLLEXPORT void player_setPacketSink(PlayerHandle handle, PlayerPacketCallback cb, void* context);

/**
 * 设置属性
 * @param handle
 * @param name 属性名称
 * @param value 属性值
 * @return > 0 表示成功
 */
DLLEXPORT int player_setProp(PlayerHandle handle, const char* name, const char* value);

 
/**
 * 开始录像
 * 不调用 stopRecord 而多次调用 startRecord , 可以实现无缝切换文件
 * @param handle
 * @param  filename  录像文件名称
 * @return 0 表示成功
 */
DLLEXPORT int player_startRecord(PlayerHandle handle, const char* filename);

/**
 * 停止录像
 * @param handle
 */
DLLEXPORT void player_stopRecord(PlayerHandle handle);

/**
 *  是否在录像中
 * @param handle
 * @return > 0 表示录像中
 */
DLLEXPORT int player_isRecording(PlayerHandle handle);



/////////////////////////////////////////////////////////////////////////////

#ifdef __cplusplus
}
#endif


#endif /* LIBLITEPLAYER_H_ */
